# -*- coding: utf-8 -*- 
# @project : 《剑指offer》
# @Author : created by bensonrachel on 2021/6/13
# @File : 删除链表中重复的节点(python超详细注释).py
# Definition for singly-linked list.

# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def deleteDuplication(self, head):  # 自己AC的题目
        """
        :type head: ListNode
        :rtype: ListNode
        """
        x = head  # 为该链表“搞一个指针”，x也就是这个head了
        y = x  # 同理y也是这个head了
        if (head == None): return None  # 如果为空的话返回0；
        tag = 0  # 标记
        if (head.val == head.next.val):
            tag = 1  # 标记开头就是重复的数字的情况
        # 以下x和y可以对掉。
        while (head.next):
            if (head.val == head.next.val):  # 第一种情况：遇到前后相同的
                while (head.next and head.val == head.next.val):  # 遍历这段相同的直到next为空（即最后一个节点）或者前后不相同了
                    head = head.next
                if (head.next):  # 如果是因为前后不相同了退出的循环，则
                    head = head.next  # 遍历到下一个
                    y.next = head  # 然后y接上这个
                else:
                    y.next = None  # 如果是因为next为空退出了循环，说明到了最后，直接接上None就行了。
                    break  # 然后这时候要退出循环了
            else:  # 第二种情况就是没遇到前后相同的，就一直连接不要断
                y = head  # y不断改变，y保持是遇到相同的前面一段的最后一个节点
                head = head.next  # 这里有个隐含义：y改变了，x也就改变了
        if (tag == 1):
            return x.next  # 开头就是重复的数字的情况，执行了上面的代码后肯定留下最开头那个，然后就这样处理即可
        return x
